package com.wiki.controller;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wiki.domain.Ebook;
import com.wiki.dto.req.EbookQueryRequestDTO;
import com.wiki.dto.req.EbookSaveRequest;
import com.wiki.dto.resp.EbookResponseDTO;
import com.wiki.dto.resp.PageResponse;
import com.wiki.dto.resp.Result;
import com.wiki.service.EbookService;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@Slf4j
@RequestMapping("/ebook")
public class EbookController {

    @Resource
    private EbookService ebookService;


    // 查询全部电子书
    @GetMapping("/list")
    public Result<PageResponse<EbookResponseDTO>> list(@Valid EbookQueryRequestDTO ebookQueryRequestDTO) {

        // 查询条件
        QueryWrapper<Ebook> queryWrapper = new QueryWrapper<>();
        queryWrapper.like(ebookQueryRequestDTO.getName() != null,"name",ebookQueryRequestDTO.getName());

        // 分页信息
        Page<Ebook> page = new Page<>(ebookQueryRequestDTO.getPage(),ebookQueryRequestDTO.getSize());
        // 分页查询
        Page<Ebook> ebookPage = ebookService.page(page,queryWrapper);
        // 获取结果集
        List<Ebook> ebooks = ebookPage.getRecords();

        //日志输出总记录数和总页数
        log.info("总记录数:{},总页数:{}",ebookPage.getTotal(),ebookPage.getPages());

        PageResponse<EbookResponseDTO> pageResponse = new PageResponse<>();
        // 转换成DTO
        List<EbookResponseDTO> ebookResponseDTOS = BeanUtil.copyToList(ebooks, EbookResponseDTO.class);

        // 设置分页信息
        pageResponse.setTotal(ebookPage.getTotal());
        // 设置结果集
        pageResponse.setList(ebookResponseDTOS);

        // 返回结果
        return Result.success(pageResponse);
    }



//    @GetMapping("/list")
//    public Result<List<EbookResponseDTO>> list() {
//        List<Ebook> ebooks = ebookService.list();
//        List<EbookResponseDTO> ebookResponseDTOS = ebooks.stream().map(ebook -> {
//            EbookResponseDTO ebookResponseDTO = new EbookResponseDTO();
//            BeanUtils.copyProperties(ebook, ebookResponseDTO);
//            return ebookResponseDTO;
//        }).toList();
//        return Result.success(ebookResponseDTOS);
//    }
//    public Result<List<EbookResponseDTO>> list() {
//        List<Ebook> ebooks = ebookService.list();
//        //使用hutool工具类,将ebooks集合转换为EbookResponseDTO集合
//        List<EbookResponseDTO> ebookResponseDTOS = BeanUtil.copyToList(ebooks, EbookResponseDTO.class);
//        return Result.success(ebookResponseDTOS);
//    }


    @PostMapping ("/query")
    public Result<List<EbookResponseDTO>> query(@RequestBody EbookQueryRequestDTO ebookQueryRequestDTO) {

        QueryWrapper<Ebook> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq(ebookQueryRequestDTO.getId() != null, "id", ebookQueryRequestDTO.getId());
//        queryWrapper.eq(ebookQueryRequestDTO.getName() != null, "name", ebookQueryRequestDTO.getName());
        queryWrapper.like(ebookQueryRequestDTO.getName() != null, "name", ebookQueryRequestDTO.getName());
        queryWrapper.eq(ebookQueryRequestDTO.getCategory1Id() != null, "category1_id", ebookQueryRequestDTO.getCategory1Id());

        // 查询电子书列表
        List<Ebook> ebooks = ebookService.list(queryWrapper);
//
//        // 将查询到的电子书列表转换为EbookResponseDTO列表
//        List<EbookResponseDTO> ebookResponseDTOS = ebooks.stream().map(ebook -> {
//            // 创建一个新的EbookResponseDTO对象
//            EbookResponseDTO ebookResponseDTO = new EbookResponseDTO();
//            // 将Ebook对象的属性复制到EbookResponseDTO对象中
//            BeanUtils.copyProperties(ebook, ebookResponseDTO);
//            // 返回转换后的EbookResponseDTO对象
//            return ebookResponseDTO;
//        }).toList();
        List<EbookResponseDTO> ebookResponseDTOS = BeanUtil.copyToList(ebooks, EbookResponseDTO.class);

        // 返回成功结果，包含转换后的电子书列表
        return Result.success(ebookResponseDTOS);
    }

    // 新增电子书， 测试aop的环绕通知
    /**
     * 处理图书保存请求
     *
     * 该方法接收一个JSON格式的图书保存请求，并将其转换为Ebook对象进行处理
     * 如果请求数据为空，则返回错误信息；否则，将数据保存或更新到数据库中
     *
     * @param ebookSaveRequest 包含图书信息的请求对象，用于创建或更新图书
     * @return 返回一个Result对象，表示操作结果
     */
    @PostMapping("/save")
    public Result<String> save(@Valid @RequestBody EbookSaveRequest ebookSaveRequest) {
        // 将请求体中的数据转换为Ebook对象
        Ebook ebook = BeanUtil.copyProperties(ebookSaveRequest, Ebook.class);
        // 检查转换后的Ebook对象是否为空
        if (ebook == null) {
            // 如果Ebook对象为空，返回错误信息，表示参数为空
            return Result.failure(400, "参数为空");
        }
        // 保存或更新图书信息
        ebookService.saveOrUpdate(ebook);
        // 返回成功信息，表示操作成功
        return Result.success();
    }

    //删除
    @DeleteMapping("/delete/{id}")
    public Result<String> delete(@PathVariable("id") Long id) {
        log.info("删除电子书id：{}", id);
        if (id == null){
            return Result.failure(400,"参数为空");
        }else {
            ebookService.removeById(id);
            return Result.success();
        }
    }




}
